// main.c
#include <iostream>
#include <dlfcn.h>
#include "load_lib.hpp"
using namespace std;

typedef void (*fptr)();

int main()
{
    cout<<"main fun start\n";
    fptr P;

    string buf;
    while (getline(cin, buf))
    {
        if (buf == "call")
        {
            break;
        }
    }

    // 加载运行时动态库
    void *runtime_handle = dlopen("./running_lib.dylib", RTLD_LAZY);
    if (!runtime_handle)
    {
        fprintf(stderr, "Error: %s\n", dlerror());
        return 1;
    }

    // 获取运行时动态库中的函数指针
    void *p = nullptr;
    p = dlsym(runtime_handle, "runtime_function");
    //void (*runtime_function_ptr)() = dlsym(runtime_handle, "runtime_function");
    void (*runtime_function_ptr)() = (fptr)p;
    
    if (!runtime_function_ptr)
    {
        fprintf(stderr, "Error: %s\n", dlerror());
        dlclose(runtime_handle);
        return 1;
    }

    // 调用运行时动态库中的函数
    runtime_function_ptr();

    // 卸载运行时动态库
    dlclose(runtime_handle);

    // 直接调用装入时动态库中的函数
    loadtime_function();

    return 0;
}